1
2
3
Далі
Скасувати фіксацію та повтор
$ git commit -m "Щось страшенно помилкове" # (0: Ваша аварія)
$ git reset HEAD ~ # (1)
<< редагувати файли за необхідності >> # (2)
$ git add. # (3)
$ git commit -c ORIG_HEAD # (4)
Ця команда відповідає за скасування. Це скасує ваш останній коміт, залишаючи ваше робоче дерево (стан ваших файлів на диску) недоторканим. Вам доведеться їх додати ще раз, перш ніж ви зможете їх знову зафіксувати).
Внесіть виправлення в робочі файли дерев.
git додайте все, що ви хочете включити у свій новий коміт.
Зафіксуйте зміни, використовуючи старе повідомлення про коміт. скидання скопійовано стару голову в .git / ORIG_HEAD; коміт за допомогою -c ORIG_HEAD відкриє редактор, який спочатку містить повідомлення журналу зі старого коміту і дозволяє редагувати його. Якщо вам не потрібно редагувати повідомлення, ви можете скористатися опцією -C.
Крім того, щоб відредагувати попередній коміт (або просто повідомлення про його фіксацію), commit --amend додасть зміни до поточного індексу до попереднього коміту.
Щоб видалити (не повернути) коміт, який було надіслано на сервер, необхідно переписати історію за допомогою git push origin master --force.
Подальше читання
Як я можу повернути HEAD назад у попереднє місце? (Від'єднана голова) & Скасувати коміти
Наведена вище відповідь покаже вам git reflog, який ви можете використовувати для визначення SHA-1 для коміту, до якого ви хочете повернутися. Отримавши це значення, використовуйте послідовність команд, як описано вище.
HEAD ~ - те саме, що HEAD ~ 1. Стаття Що таке HEAD у git? корисно, якщо ви хочете скасувати декілька комітів.
|
Скасувати фіксацію трохи страшно, якщо ви не знаєте, як це працює. Але насправді це надзвичайно просто, якщо ти все-таки зрозумієш. Я покажу вам 4 різні способи скасування коміту.
варіант 1: git reset --hard
Скажімо, у вас це є, де C - це ваша ГОЛОВА, а (F) - стан ваших файлів.
(F)
A-B-C
↑
майстер
Ви хочете запустити коміт C і ніколи більше не бачити його і втратити всі зміни в локально змінених файлах. Ви робите це:
git reset --hard HEAD ~ 1
Результат:
(F)
A-B
↑
майстер
Тепер B - ГОЛОВА. Оскільки ви використовували --hard, ваші файли скидаються до свого стану при коміті B.
варіант 2: скидання git
Ага, але припустимо, що коммітування C не було катастрофою, а лише трохи. Ви хочете скасувати фіксацію, але збережіть зміни трохи редагування, перш ніж робити краще коміт. Починаючи знову звідси, а С - ГОЛОВА:
(F)
A-B-C
↑
майстер
Ви можете зробити це, не кажучи про --hard:
git reset HEAD ~ 1
У цьому випадку результат:
(F)
A-B-C
↑
майстер
В обох випадках HEAD - це лише вказівник на останній коміт. Коли ви робите GIT reset HEAD ~ 1, ви говорите Git перемістити вказівник HEAD назад на один коміт. Але (якщо ви не використовуєте --hard) ви залишаєте свої файли такими, якими вони були. Тож тепер статус git показує зміни, які ви перевірили в C. Ви нічого не втратили!
варіант 3: git reset --soft
Для найлегшого дотику ви навіть можете скасувати фіксацію, але залишити файли та індекс:
git reset --soft HEAD ~ 1
Це не лише залишає ваші файли в спокої, але навіть залишає ваш індекс у спокої. Коли ви зробите статус git, ви побачите, що в індексі є ті самі файли, що і раніше. Насправді, відразу після цієї команди, ви можете зробити коміт git, і ви повторите той самий коміт, який ви щойно мали.
варіант 4: ви зробили git reset --hard і вам потрібно отримати цей код назад
Ще одне: припустимо, ви знищуєте коміт, як у першому прикладі, але потім виявляєте, що він вам все-таки потрібен? Важка удача, так?
Ні, ще є спосіб повернути його. Введіть git reflog, і ви побачите список (часткових) шасів комітів (тобто хешів), в які ви переїхали. Знайдіть комміт, який ви знищили, і зробіть це:
git checkout -b someNewBranchName shaYouDestroyed
Ви тепер воскресили цю комісію. Комітети насправді не знищуються в Git протягом якихось 90 днів, тому ви зазвичай можете повернутися назад і врятувати той, від якого не хотіли позбутися.
|
Існує два способи "скасувати" ваш останній коміт, залежно від того, чи вже ви зробили свій коміт загальнодоступним (переміщений у віддалене сховище):
Як скасувати локальний коміт
Скажімо, я зробив комісію локально, але зараз я хочу видалити це комітування.
git log
commit 101: bad commit # Остання комісія. Це буде називатися "ГОЛОВА".
commit 100: good commit # Другий до останнього коміту. Це та, яку ми хочемо.
Щоб відновити все так, як було до останнього коміту, нам потрібно скинути коміт перед HEAD:
git reset --soft HEAD ^ # Використовуйте --soft, якщо хочете зберегти зміни
git reset --hard HEAD ^ # Використовуйте --hard, якщо вам байдуже зберегти внесені вами зміни
Тепер git log покаже, що наш останній коміт був видалений.
Як скасувати публічну комісію
Якщо ви вже зробили свої коміти загальнодоступними, ви захочете створити новий коміт, який "поверне" зміни, внесені у попередній коміт (поточний HEAD).
git revert HEAD
Тепер ваші зміни буде скасованоі готовий до вас зробити:
git commit -m 'відновлення файлу, який я випадково видалив'
git log
коміт 102: відновлення файлу, який я видалив випадково
коміт 101: видалення файлу, який нам не потрібен
коміт 100: додавання потрібного нам файлу
Для отримання додаткової інформації перегляньте Основи Git - Скасування речей.
|
Додайте / видаліть файли, щоб отримати речі так, як ви хочете:
git rm classdir
git додати Sourcedir
Потім внесіть зміни до коміту:
git commit --amend
Попередній помилковий коміт буде відредагований, щоб відображати новий стан індексу - іншими словами, це буде так, ніби ви ніколи не допустили помилки.
Зверніть увагу, що це слід робити лише в тому випадку, якщо ви ще не натискали. Якщо ви натиснули, то вам просто доведеться зробити виправлення нормально.
|
git rm yourfiles / *. class
git commit -a -m "видалив усі файли класів у папці 'yourfiles'"
або
git reset --hard HEAD ~ 1
Попередження: Вищевказана команда назавжди видалить модифікації файлів .java (та будь-яких інших файлів), які ви хотіли здійснити.
Апаратне скидання до HEAD-1 встановить вашу робочу копію у стан коміту перед вашим неправильним комітом.
|
Змінити останній коміт
Замініть файли в індексі:
git rm --cached * .class
git add * .java
Потім, якщо це приватне відділення, внесіть зміни до коміту:
git commit --amend
Або, якщо це спільна гілка, зробіть новий коміт:
git commit -m 'Замінити файли .class файлами .java'
(Щоб змінити попередній коміт, використовуйте чудову інтерактивну базу даних.)
ProTip ™: Додайте * .class до gitignore, щоб зупинити це повторення.
Щоб скасувати коміт
Внесення змін до коміту - ідеальне рішення, якщо вам потрібно змінити останній коміт, але більш загальне рішення скидається.
Ви можете скинути Git до будь-якого коміту за допомогою:
git reset @ ~ N
Де N - кількість комітів перед HEAD, а @ ~ скидається до попереднього коміту.
Отже, замість внесення змін до коміту ви можете використовувати:
git reset @ ~
git add * .java
git commit -m "Додати .java файли"
Перегляньте git help reset, зокрема розділи --soft --mixed та --hard, щоб краще зрозуміти, що це робить.
Reflog
Якщо ви зіпсуєте, ви завжди можете скористатися перегляданням, щоб знайти скинуті коміти:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: скидання: перехід до @ ~
2c52489 HEAD @ {1}: коміт: додано кілька файлів .class
$ git скинути 2c52489
... і ти повернувся там, з чого почав
|
Використовуйте git revert .
Щоб отримати ідентифікатор коміту, просто використовуйте git log.
|
Якщо ви плануєте повністю скасувати локальний коміт, незалежно від того, що ви змінили, що робили під час коміту, і якщо вас це нічого не турбує, просто виконайте наступну команду.
git reset --hard HEAD ^ 1
(Ця команда проігнорує весь ваш коміт, а ваші зміни будуть повністю втрачені з вашого локального робочого дерева). Якщо ви хочете скасувати фіксацію, але ви хочете, щоб ваші зміни відбулися в проміжній області (перед комітом, як і після git add), виконайте наступну команду.
git reset --soft HEAD ^ 1
Тепер ваші зафіксовані файли потрапляють у індексну область. Припустимо, якщо ви хочете вивести на екран файли, оскільки вам потрібно відредагувати неправильний вміст, виконайте наступну команду
git скинути HEAD
Тепер фіксовані файли надходять із індексованої області в неінтерактивну. Тепер файли готові до редагування, тому, що б ви не змінили, ви хочете перейти до редагування та додали його та зробіть новий / новий коміт.
Більше (посилання порушено) (Архівна версія)
|
Якщо у вас встановлені додатки Git, ви можете запустити git undo, щоб скасувати останню коміт. git undo 3 скасує останні три коміти.
|
Я хотів скасувати останні п’ять комітів у нашому спільному сховищі. Я шукав ідентифікатор редакції, до якого я хотів повернутися. Потім я набрав наступне.
підказка> git reset --hard 5a7404742c85
HEAD зараз за номером 5a74047 Додав ще одну сторінку до каталогу
підказка> git push origin master --force
Всього 0 (дельта 0), повторно використане 0 (дельта 0)
дистанційне: bb / acl: дозволяється неочищення очей. прийняте корисне навантаження.
На адресу git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 master -> master (примусове оновлення)
підказка>
|
Я вважаю за краще використовувати git rebase -i для цієї роботи, тому що з’являється приємний список, де я можу вибрати коміти, яких потрібно позбутися. Це може бути не так прямо, як деякі інші відповіді тут, але це просто відчуває себе правильно.
Виберіть, скільки комітів ви хочете перерахувати, а потім викликайте так (щоб записати останні три)
git rebase -i HEAD ~ 3
Зразок списку
виберіть aa28ba7 Санітарну перевірку порту RtmpSrv
виберіть варіант версії c26c541 RtmpSrv
вибрати 58d6909 Краща підтримка декодування URL
Потім Git видалить коміти для будь-якого рядка, який ви видалите.
|
Як виправити попередній локальний коміт
Використовуйте git-gui (або подібний) для виконання коміту git --amend. За допомогою графічного інтерфейсу ви можете додавати або видаляти окремі файли з коміту. Ви також можете змінити повідомлення коміту.
Як скасувати попередній локальний коміт
Просто скиньте свою гілку до попереднього місця (наприклад, використовуючи gitk або git rebase). Потім повторно застосуйте зміни зі збереженої копії. Після збору сміття у вашому локальному сховищі буде схоже на те, що небажаного коміту ніколи не було. Щоб зробити все це за одну команду, використовуйте git reset HEAD ~ 1.
Словопопередження: Недбале використання git reset - це хороший спосіб перевести вашу робочу копію в заплутаний стан. Рекомендую новачкам Git уникати цього, якщо можуть.
Як скасувати публічну комісію
Виконайте зворотний підбір вишні (git-revert), щоб скасувати зміни.
Якщо ви ще не внесли інші зміни у свою гілку, ви можете просто зробити ...
git revert --no-edit HEAD
Потім відправте оновлену гілку до спільного сховища.
Історія комітів відображатиме обидва коміти окремо.
Додатково: виправлення приватного відділення у відкритому сховищі
Це може бути небезпечно - переконайтесь, що у вас є локальна копія гілки, яку потрібно відтиснути.
Також зауважте: Ви не хочете цього робити, якщо хтось інший може працювати у гілці.
git push --delete (ім'я_відгалуження) ## видалити загальнодоступну версію гілки
Очистіть свою гілку локально, а потім натисніть ...
git push origin (ім'я_відгалуження)
У звичайному випадку вам, мабуть, не потрібно турбуватися про те, що історія комітів вашої приватної філії є незайманою. Просто натисніть наступний коміт (див. "Як скасувати публічний коміт" вище), а пізніше, зробіть сквош-злиття, щоб приховати історію.
|
Якщо ви хочете назавжди скасувати це, і ви клонували деяке сховище
Ідентифікатор коміту можна побачити
git log
Тоді ви можете зробити -
git reset --hard
git push origin <ім'я_гілки> -f
|
Якщо ви вчинили сміття, але не штовхнули,
git reset --soft HEAD ~ 1
HEAD ~ 1 - це скорочення для коміту перед головою. Якщо ви хочете скинути значення, ви можете звернутися до SHA-1 хешу. Опція --soft видалить фіксацію, але всі ваші змінені файли залишить "Зміни, які потрібно здійснити", як зазначив би статус git.
Якщо ви хочете позбутися будь-яких змін у відстежуваних файлах у робочому дереві, починаючи з коміту перед головою, використовуйте замість цього "--hard".
АБО
Якщо ви вже натискали і хтось тягнув, як правило, це мій випадок, ви не можете використовувати git reset. Однак ви можете зробити git revert,
git revert HEAD
Це створить новий коміт, який скасовує все, введене випадковим комітом.
|
На SourceTree (графічний інтерфейс для GitHub) ви можете клацнути правою кнопкою миші коміт і виконати "Зворотний коміт". Це має скасувати ваші зміни.
На терміналі:
Ви можете альтернативно використовувати:
git revert
Або:
git reset --soft HEAD ^ # Використовуйте --soft, якщо хочете зберегти зміни.
git reset --hard HEAD ^ # Використовуйте --hard, якщо ви не дбаєте про збереження змін.
|
Одна команда:
git reset --soft 'HEAD ^'
Чудово працює скасування останнього локального коміту!
|
Просто скиньте його, виконавши команду нижче, використовуючи git:
git reset --soft HEAD ~ 1
Поясніть: що робить git reset, він в основному скидається до будь-якого коміту, до якого ви хочете повернутися, тоді, якщо ви поєднаєте його з --soft key, він повернеться назад, але збереже зміни у ваших файлах, так що Ви повертаєтесь до етапу, на якому щойно доданий файл, HEAD - це головка гілки, і якщо ви поєднуєте з ~ 1 (у цьому випадку ви також використовуєте HEAD ^), він повернеться назад лише одним комітом, який саме вам потрібно. ..
Я створюю кроки на зображенні нижче для більш детальної інформації для вас, включаючи всі кроки, які можуть відбуватися в реальних ситуаціях, і фіксацію коду:
|
Як скасувати останні коміти Git?
Щоб відновити все так, як було до останнього коміту, нам потрібно скинути коміт перед HEAD.
Якщо ви не хочете зберігати внесені вами зміни:
git reset --hard HEAD ^
Якщо ви хочете зберегти зміни:
git reset --soft HEAD ^
Тепер перевірте свій журнал git. Це покаже, що наш останній коміт був видалений.
|
"Скинути робоче дерево до останнього коміту"
git reset --hard HEAD ^
"Очистити невідомі файли з робочого дерева"
git clean
див. - Git Quick Reference
ПРИМІТКА. Ця команда видалить попередню коміт, тому використовуйте з обережністю! git reset --hard є безпечнішим.
|
Використовуйте рефлог, щоб знайти правильний стан
git reflog
РЕГЛОГУЙТЕ ДО СКИДАННЯ
Виберіть правильний перезапис (у моєму випадку f3cb6e2) і введіть
git reset --hard f3cb6e2
Після цього РЕПО HEAD буде скинуто до цього HEADid
ВХІД ПІСЛЯ СКИДАННЯ
Нарешті релог виглядає як на малюнку нижче
ЗАКЛЮЧИТИ РЕФЛОГ
|
Перший запуск:
git reflog
Він покаже вам усі можливі дії, які ви виконували над своїм сховищем, наприклад, фіксація, об’єднання, витягування тощо.
Тоді виконайте:
git reset --hard ActionIdFromRefLog
|
Скасувати останню коміт:
git reset --soft HEAD ^ або git reset --soft HEAD ~
Це скасує останнє комітування.
Тут --soft означає перезапуск у постановку.
HEAD ~ або HEAD ^ означає перейти до фіксації перед HEAD.
Замінити останній коміт на новий коміт:
git commit --amend -m "повідомлення"
Він замінить останній коміт новим комітом.
|
Інший спосіб:
Оформіть гілку, яку потрібно повернути, а потім скиньте свою локальну робочу копію назад до коміту, який ви хочете бути останнім на віддаленому сервері (все після цього пройде до побачення). Для цього в SourceTree я клацнув правою кнопкою миші та вибрав "Скинути ІНФОРМАЦІЮ до цього коміту".
Потім перейдіть до локального каталогу вашого сховища та запустіть цю команду:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEФІЛІЯ: ФІЛІЯ
Це видалить усі коміти після поточного у вашому локальному сховищі, але лише для цієї однієї гілки.
|
Введіть git log і знайдіть останній хеш-код коміту, а потім введіть:
git reset <попереднє співробітництво>
|
У моєму випадку я випадково скопіював деякі файли, яких не хотів. Тож я зробив наступне, і це спрацювало:
git reset --soft HEAD ^
git rm --cached [файли, які вам не потрібні]
git add [потрібні файли]
git коміт -c ORIG_HEAD
Перевірте результати за допомогою gitk або git log --stat
|
Просто, запустіть це у своєму командному рядку:
git reset --soft HEAD ~
|
Є два основних сценарії
Ви ще не натиснули коміт
Якщо проблема полягала в зайвих файлах, які ви зафіксували (а ви не хочете, щоб вони були у сховищі), ви можете видалити їх за допомогою git rm, а потім зафіксувати за допомогою --amend
git rm
Ви також можете видалити цілі каталоги за допомогою -r або навіть комбінувати з іншими командами Bash
git rm -r
git rm $ (знайти-ім'я '* .class')
Після видалення файлів ви можете здійснити коміт за допомогою параметра --amend
git commit --amend -C HEAD # - опція -C полягає у використанні того самого повідомлення коміту
Це перезапише ваш нещодавній локальний коміт, видаливши зайві файли, отже, ці файли ніколи не будуть відправлені на push, а також будуть видалені GC із вашого локального сховища .git.
Ви вже натиснули фіксацію
Ви можете застосувати те саме рішення іншого сценарію, а потім виконати git push з опцією -f, але це не рекомендується, оскільки воно перезаписує віддалену історію з різними змінами (це може зіпсувати ваше сховище).
Натомість вам потрібно зробити коміт без --amend (пам'ятайте про -amend`: ця опція переписує історію останнього коміту).
|
Для локального коміту
git reset --soft HEAD ~ 1
або якщо ви не пам'ятаєте, в якому саме коміті це, ви можете використовувати
git rm --cached <файл>
Для натиснутого коміту
Правильний спосіб видалення файлів з історії сховища - використання git filter-branch. Це є,
git filter-branch --index-filter 'git rm --cached ' HEAD
Але я рекомендую вам використовувати цю команду обережно. Детальніше читайте на сторінці керівництва git-filter-branch (1).
|
Щоб повернутися до попередньої версії, остаточно видаливши всі незмінені зміни:
git reset --hard HEAD ~ 1
|
ЩО ВИКОРИСТОВУВАТИ, скинути - м’який чи скинути - жорсткий?
Я просто додаю два центи за відповідь @ Kyralessa:
Якщо ви не впевнені, що використовувати, перейдіть до --soft (я використав цю конвенцію, щоб запам'ятати його --soft для безпечного використання).
Чому?
Якщо ви вирішите - жорстко помилково, ви ВТРАТИТЕ свої зміни, як це не було раніше.
Якщо ви вибрали --soft помилково, ви можете досягти тих самих результатів --hard, застосовуючи додаткові команди
git reset HEAD file.html
git checkout - file.html
Повний приклад
echo "деякі зміни ..."> file.html
git add file.html
git commit -m "неправильний коміт"
# Мені потрібно скинути
git reset --hard HEAD ~ 1 (скасувати зміни)
# АБО
git reset --soft HEAD ~ 1 # Повернення до інсценізації
git reset HEAD file.html # назад до робочого каталогу
git checkout - file.html # скасувати зміни
Подяки надходить до @Kyralessa.
|
1
2
3
Далі
Високоактивне запитання. Заробіть 10 репутації, щоб відповісти на це питання. Вимога про репутацію допомагає захистити це питання від спаму та відсутності відповідей.
Не відповідь, яку ви шукаєте? Перегляньте інші запитання з тегом git-control version git-commit undo або задайте власне запитання.